KTN-04
| Field | Isi |
|---|---|
| Dokumen ID | KTN-04 |
| Deskripsi | Memberikan ambang batas barang kena pajak pada penjualan |
| Nomor Revisi | 2 |
| Tanggal | 2026-10-04 |
| Keterangan | Field diganti ke qty_minimal_pajak di SKU_Konversis; snapshot ikut ke baris penjualan dan SO |
1. Ringkasan
a. In scope
- Input ambang batas kena pajak (
qty_minimal_pajak) per baris konversi satuan di master barang (SKU_Konversis) - Penyimpanan
qty_minimal_pajakdalam satuan terkecil (input user ×conversion_rate) - Snapshot
qty_minimal_pajakpada baris penjualan (Penjualans) dan baris SO (SOs) - Informasi dan penerapan ambang batas saat membuat SO, penjualan langsung, dan penjualan atas SO
b. Catatan
- Ambang batas berada di tiap konversi satuan (
SKU_Konversis), bukan di level barang / brand config - Nilai yang disimpan selalu dalam satuan terkecil agar perbandingan qty seragam
- Karena ambang pajak berlaku per baris barang yang dijual / dipesan,
qty_minimal_pajakikut tersimpan diPenjualansdanSOs - Barang tetap memakai PPN master yang sama; yang menentukan kena pajak atau tidak adalah apakah qty baris melewati
qty_minimal_pajak
c. Kesimpulan
- [FE] Tambah input
qty_minimal_pajakpada tiap barisSKU_Konversissaat create / update master barang; simpan sebagai input ×conversion_rate - [FE] Tampilkan dan terapkan ambang batas pada SO
- [FE] Tampilkan dan terapkan ambang batas pada penjualan langsung
- [FE] Tampilkan dan terapkan ambang batas pada penjualan atas SO
- [BE] Tambah kolom
qty_minimal_pajakpadaSKU_Konversis,Penjualans, danSOs - [BE] Create / update barang menerima dan menyimpan
qty_minimal_pajakper konversi (nilai sudah dalam satuan terkecil) - [BE] Create / update SO, penjualan, dan penjualan atas SO menerima
qty_minimal_pajakper baris dan menerapkan logika PPN vs ambang batas
2. Functional Requirement
| Kode | Deskripsi |
|---|---|
| FR-01 | Tiap baris SKU_Konversis memiliki field qty_minimal_pajak |
| FR-02 | Saat create / update barang, qty_minimal_pajak disimpan sebagai input user dikali conversion_rate ke satuan terkecil |
| FR-03 | qty_minimal_pajak ikut tersimpan pada tiap baris Penjualans |
| FR-04 | qty_minimal_pajak ikut tersimpan pada tiap baris SOs |
| FR-05 | Informasi ambang batas tampil dan dipakai pada SO, penjualan langsung, dan penjualan atas SO |
| FR-06 | Jika qty baris (satuan terkecil) melewati qty_minimal_pajak, PPN wajib diterapkan pada baris tersebut |
3. Use Case List
| Kode | Deskripsi |
|---|---|
| UC-01 | Mengisi qty minimal pajak pada konversi satuan master barang |
| UC-02 | Melihat dan menerapkan ambang batas saat membuat SO |
| UC-03 | Melihat dan menerapkan ambang batas saat membuat penjualan langsung |
| UC-04 | Melihat dan menerapkan ambang batas saat membuat penjualan atas SO |
| UC-05 | Memastikan baris yang melewati ambang batas dikenai PPN |
4. Use Case Scenario
UC-01 : Mengisi qty minimal pajak pada konversi satuan master barang
| Aktor | Pengguna master barang |
| Deskripsi | User mengisi ambang batas kena pajak per konversi satuan saat membuat / mengubah barang |
| Prekondisi | - Pengguna terautentikasi - Memiliki akses master barang - Halaman create / edit barang dapat dibuka |
| Alur utama | 1. User membuka form buat / edit barang. 2. User mengatur SKU dan daftar konversi satuan. 3. Pada tiap baris SKU_Konversis, user mengisi qty minimal pajak dalam satuan konversi tersebut.4. Sistem menghitung nilai simpan = input × conversion_rate ke satuan terkecil.5. User menyimpan barang. |
| Alur negatif | - Jika validasi field gagal, data tidak tersimpan dan muncul pesan error. - Jika pengguna tidak berwenang, simpan ditolak. |
| Bisnis rule | - Setiap konversi punya qty_minimal_pajak sendiri.- Nilai tersimpan selalu dalam satuan terkecil ( input × conversion_rate).- Untuk satuan terkecil, conversion_rate = 1 sehingga nilai simpan = input user. |
| Postkondisi | Tiap SKU_Konversis memiliki qty_minimal_pajak |
| Trigger | User membuat atau mengedit barang |
| Kode FR | FR-01 FR-02 |
UC-02 : Melihat dan menerapkan ambang batas saat membuat SO
| Aktor | Pengguna SO |
| Deskripsi | User melihat ambang batas per baris dan sistem menerapkan PPN sesuai ambang saat membuat SO |
| Prekondisi | - Pengguna terautentikasi - Hak akses SO - Master barang sudah punya qty_minimal_pajak pada konversi yang dipakai |
| Alur utama | 1. User membuka halaman buat SO. 2. User menambah baris barang dan memilih satuan / konversi. 3. Sistem menampilkan informasi ambang batas dari SKU_Konversis terkait.4. Saat simpan, tiap baris SOs menyimpan snapshot qty_minimal_pajak.5. Jika qty baris (satuan terkecil) melewati ambang, PPN baris diterapkan. |
| Alur negatif | - Jika gagal memuat data barang / konversi, ambang batas tidak tampil dan muncul pesan error. - Jika brand tidak PKP ( default_pengusaha_kena_pajak = 0), logika ambang batas diabaikan. |
| Bisnis rule | - Ambang pajak per baris SO, bukan per header. - qty_minimal_pajak pada SOs adalah snapshot dari konversi yang dipakai. |
| Postkondisi | SO tersimpan dengan qty_minimal_pajak dan PPN baris sesuai ambang |
| Trigger | User membuat SO |
| Kode FR | FR-04 FR-05 FR-06 |
UC-03 : Melihat dan menerapkan ambang batas saat membuat penjualan langsung
| Aktor | Pengguna penjualan |
| Deskripsi | User melihat ambang batas per baris dan sistem menerapkan PPN sesuai ambang saat membuat penjualan langsung |
| Prekondisi | - Pengguna terautentikasi - Hak akses penjualan - Halaman buat penjualan dapat dibuka |
| Alur utama | 1. User membuka halaman buat penjualan langsung. 2. User menambah baris barang dan memilih satuan / konversi. 3. Sistem menampilkan informasi ambang batas dari SKU_Konversis terkait.4. Saat simpan, tiap baris Penjualans menyimpan snapshot qty_minimal_pajak.5. Jika qty baris (satuan terkecil) melewati ambang, PPN baris diterapkan. |
| Alur negatif | - Jika gagal memuat data barang / konversi, ambang batas tidak tampil dan muncul pesan error. - Jika brand tidak PKP ( default_pengusaha_kena_pajak = 0), logika ambang batas diabaikan. |
| Bisnis rule | - Ambang pajak per baris penjualan. - qty_minimal_pajak pada Penjualans adalah snapshot dari konversi yang dipakai. |
| Postkondisi | Invoice penjualan tersimpan dengan qty_minimal_pajak dan PPN baris sesuai ambang |
| Trigger | User membuat penjualan langsung |
| Kode FR | FR-03 FR-05 FR-06 |
UC-04 : Melihat dan menerapkan ambang batas saat membuat penjualan atas SO
| Aktor | Pengguna penjualan |
| Deskripsi | User membuat penjualan dari SO dengan ambang batas ikut terbawa / diterapkan per baris |
| Prekondisi | - Pengguna terautentikasi - SO terkait sudah ada - Hak akses penjualan atas SO |
| Alur utama | 1. User membuka halaman buat penjualan atas SO. 2. Sistem memuat baris SO beserta qty_minimal_pajak.3. User melengkapi data penjualan bila perlu. 4. Saat simpan, tiap baris Penjualans menyimpan qty_minimal_pajak.5. Jika qty baris (satuan terkecil) melewati ambang, PPN baris diterapkan. |
| Alur negatif | - Jika SO tidak ditemukan, proses tidak dilanjutkan. - Jika brand tidak PKP, logika ambang batas diabaikan. - Jika validasi gagal, penjualan tidak tersimpan. |
| Bisnis rule | - Ambang batas pada penjualan atas SO tetap per baris barang. - Snapshot di Penjualans mengikuti nilai ambang yang dipakai pada transaksi (dari SO / konversi terkait). |
| Postkondisi | Penjualan atas SO tersimpan dengan qty_minimal_pajak dan PPN sesuai ambang |
| Trigger | User membuat penjualan atas SO |
| Kode FR | FR-03 FR-05 FR-06 |
UC-05 : Memastikan baris yang melewati ambang batas dikenai PPN
| Aktor | Sistem BE |
| Deskripsi | BE memastikan perhitungan PPN baris mengikuti qty_minimal_pajak |
| Prekondisi | FE mengirim payload SO / penjualan yang valid |
| Alur utama | 1. FE menembak API create / update SO atau penjualan. 2. BE cek config brand default_pengusaha_kena_pajak. Jika nonaktif, abaikan logika ambang batas.3. Untuk tiap baris, bandingkan qty dalam satuan terkecil dengan qty_minimal_pajak baris.4. Jika qty melewati ambang, terapkan PPN baris; jika tidak, tidak menerapkan PPN baris. 5. Simpan header + baris termasuk qty_minimal_pajak dan nilai PPN. |
| Alur negatif | - Jika payload tidak valid, request ditolak. - Jika brand non-PKP, seluruh logika ambang dilewati. |
| Bisnis rule | - Perbandingan qty memakai satuan terkecil. - Ambang batas dicek per baris, bukan per invoice. |
| Postkondisi | Dokumen tersimpan dengan PPN sesuai ambang batas |
| Trigger | Create / update SO, penjualan langsung, atau penjualan atas SO |
| Kode FR | FR-06 |
5. Data Flow Diagram
DFD-01 — Ambang batas kena pajak dari konversi ke transaksi
6. Sequence Diagram
SD-01 — UC-01 : Mengisi qty minimal pajak pada konversi satuan master barang
SD-02 — UC-02 : Melihat dan menerapkan ambang batas saat membuat SO
SD-03 — UC-03 : Melihat dan menerapkan ambang batas saat membuat penjualan langsung
SD-04 — UC-04 : Melihat dan menerapkan ambang batas saat membuat penjualan atas SO
SD-05 — UC-05 : Memastikan baris yang melewati ambang batas dikenai PPN
7. Table Schema
| Table | Field | Status | Deskripsi |
|---|---|---|---|
SKU_Konversis | qty_minimal_pajak | new | Ambang qty kena pajak per konversi; disimpan dalam satuan terkecil (input × conversion_rate) |
Penjualans | qty_minimal_pajak | new | Snapshot ambang pajak per baris penjualan |
SOs | qty_minimal_pajak | new | Snapshot ambang pajak per baris SO |
8. API Schema
| Endpoint | Status | Perubahan |
|---|---|---|
POST /[url_barang]/v2-1/barang | changed | Terima qty_minimal_pajak di sku.SKU_Konversis / konversi |
POST /[url_barang]/v2-1/barang/bulk-update | changed | Terima qty_minimal_pajak di sku.SKU_Konversis / konversi |
GET /[url_barang]/barang | changed | Response SKU_Konversis memuat qty_minimal_pajak |
GET /[url_barang]/barang/:id | changed | Response SKU_Konversis memuat qty_minimal_pajak |
POST /[url_penjualan]/invoice-so | changed | Terima / simpan qty_minimal_pajak per baris SO + logika PPN vs ambang |
GET /[url_penjualan]/invoice-so/:id | changed | Response SOs memuat qty_minimal_pajak |
POST /[url_penjualan]/penjualan | changed | Terima / simpan qty_minimal_pajak per baris penjualan + logika PPN vs ambang |
PUT /[url_penjualan]/penjualan/:id | changed | Update baris penjualan termasuk qty_minimal_pajak bila relevan |